# @Time : 2024-11-07 10:12
# @Author : Fioman 
# @Phone : 13149920693
"""
concurrent.futures.wait() 函数用于等待一组Future对象完成.这对于在多个异步任务完成之前阻塞代码非常
有用.
功能: 等待给定的Future对象集合中的任务完成
参数:
fs:一个包含Future对象的集合
timeout(可选): 等待的最长时间(以秒为单位),如果未指定,则无线等待.
return_when(可选): 指定在什么情况下返回.可能是以下值之一:
FIRST_COMPLETED：当第一个任务完成时返回。
FIRST_EXCEPTION：当第一个任务引发异常时返回。
ALL_COMPLETED：当所有任务完成时返回。
返回值:
一个元组,其中包含两个集合.一个集合包含已经完成的Future对象,第二个集合包含尚未完成的Future对象.
"""
import time
from concurrent.futures import ThreadPoolExecutor, wait, FIRST_COMPLETED


def task(n, a):
    print(f"task {n} 开始")
    time.sleep(n)
    print(f"task {n} 结束")
    return n


if __name__ == '__main__':
    with ThreadPoolExecutor(max_workers=4) as executor:
        # 和Thread的传递参数的方式不太一样,是位置传参或者是关键字参数传参,而不是元组传参
        futures = [executor.submit(task, i, i) for i in range(1, 11)]
        done, notDone = wait(futures, return_when=FIRST_COMPLETED)
        for future in done:
            print(f"{future}结束了,返回结果: {future.result()}")

        for future in notDone:
            print(f"{future}是否还在运行: {future.running()}")  # 非运行状态,有可能是pending状态
            # 任务在执行前的状态是pending，当任务开始执行后，状态变为running，执行完成后变为done。
